//
// Created by sjjmw on 3/24/2022.
//
#include "iostream"
#include "vector"
#include "list"
#include "algorithm"
#include "string"
#include "unordered_map"
#include "cmath"
#include<iomanip>
#include "string"
#include "map"
#include "list"

//注意点：
//1。 //不重复，所以可以直接缩小范围
//2.//输出要倒叙

//下一级
struct Sol{
    std::vector<int> vec;
    int sum_to;
    int res_cnt=0;
//    std::unordered_map<int,char> selected;
    std::vector<int> set;
//    std::vector<std::vector<int>> ress;
    void dfs(int sum,int begin){
        if(begin!=vec.size()-1&&sum==sum_to){
            //输出要倒叙
            for (int i = 0; i < set.size(); ++i) {
                printf("%d ",set[set.size()-1-i]);
            }
            printf("\n");
//            ress.push_back(set);
            res_cnt++;
        }
        for(int i=begin;i>=0;i--){
            auto v=vec[i];
//            if(selected.find(v)==selected.end()){
//                selected[v]=1;
                set.push_back(v);
                //不重复，所以可以直接缩小范围
                dfs(sum+v,i-1);
                set.pop_back();
//                selected.erase(v);
//            }
        }
    }
    void handle(int n
            ){
        vec.resize(n);
        for (int i = 0; i < n; ++i) {
            std::cin>>vec[i];
            //            vec.push_back()
        }

        std::cin>>sum_to;
        dfs(0,n-1);

//        for(int i=ress.size()-1;i>=0;i--){
//            auto res=ress[i];
//
//        }
        printf("%d",res_cnt);
//        printf("%d\n",res_cnt);
//        printf("%d\n",res);
    }
};
int main(){
//    int a,b,c;
    float a,b,c,d;
    int e;
    while(std::cin>>a){
        Sol().handle(a);
    }

    return 0;
}